package cn.bearspark.article.provider.dao.buffer;

import cn.bearspark.article.provider.dao.co.CategoryCO;
import cn.bearspark.article.provider.dao.key.CategoryBufferKeyBuilder;
import cn.bearspark.article.provider.dao.mapper.CategoryMapper;
import cn.bearspark.framework.redis.starter.buffer.hash.un.RedisHashBuffer;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * 专栏分类的 hash 数据结构的缓存器
 *
 * @author f
 */
@Component
public class CategoryHashBuffer extends RedisHashBuffer<CategoryCO> {

    /**
     * 专栏分类缓存数据的过期时间
     */
    private static final int CATEGORY_INFO_EXPIRE = 60 * 3;

    /**
     * 专栏分类最简信息的字段名称集合
     */
    private final List<String> slimInfoList;

    /**
     * 专栏分类简单信息的字段名称集合
     */
    private final List<String> simpleInfoList;

    public CategoryHashBuffer(RedisTemplate<String, Object> redisTemplate,
                              CategoryBufferKeyBuilder categoryBufferKeyBuilder,
                              CategoryMapper categoryMapper) {
        super(
                redisTemplate,
                categoryBufferKeyBuilder,
                CATEGORY_INFO_EXPIRE,
                CategoryCO.class,
                categoryMapper
        );

        // 加 articleNum 是为了防止查询缺失的热数据
        this.slimInfoList = List.of("categoryId", "categoryName", "articleNum");
        this.simpleInfoList = List.of("categoryId", "categoryName", "articleNum");
    }

    /**
     * 获取指定专栏分类的最简信息
     *
     * @param categoryIdList 待获取信息的专栏分类 id 集合
     * @return 指定专栏分类的最简信息映射，key：专栏分类的 id，value：专栏分类的缓存对象
     */
    public Map<Long, CategoryCO> mapSlim(List<Long> categoryIdList) {
        return super.map(categoryIdList); // TODO 使用 mapLess()
    }

    /**
     * 获取指定专栏分类的简单信息
     *
     * @param categoryIdList 待获取信息的专栏分类 id 集合
     * @return 指定专栏分类的简单信息映射，key：专栏分类的 id，value：专栏分类的缓存对象
     */
    public Map<Long, CategoryCO> mapSimple(List<Long> categoryIdList) {
        return super.map(categoryIdList); // TODO 使用 mapLess()
    }
}
